[fea]
[使用蓝牙广播]
This commit is contained in:
yangyakun
2024-11-28 17:30:07 +08:00
parent 7e97389c6f
commit b04680ef37
2 changed files with 25 additions and 16 deletions

View File

@@ -13,6 +13,7 @@ import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.utils.RxUtils
import io.reactivex.disposables.Disposable
import java.util.UUID
import java.util.concurrent.ConcurrentLinkedQueue
import kotlin.properties.Delegates
object AdvertisManager {
@@ -38,12 +39,14 @@ object AdvertisManager {
@SuppressLint("MissingPermission")
fun closeAllBroadCast(){
if (callbackListUsing.isEmpty()) {
if (callbackListUsing.isEmpty()&& waitBroadData.isEmpty()) {
return
}
callbackListUsing.forEach {
stopBroadCast(it)
it.dataInnser = null
}
waitBroadData.clear()
callbackListUnUse.addAll(callbackListUsing)
callbackListUsing.clear()
}
@@ -62,37 +65,38 @@ object AdvertisManager {
if(data==null){
if(waitBroadData.isEmpty()){
return
}else{
val last = waitBroadData.last()
tempData = last
}
val last = waitBroadData.last()
tempData = last
}else{
tempData = data
// 查找订单一样的广播替换数据
val sameData = findSampleOrderAndReplace(tempData)
if(sameData!=null){
CallerLogger.d(TAG,"停止广播:${tempData}")
if (sameData is BleBroadCastData) {
CallerLogger.d(TAG,"找到重复数据、在待广播中${tempData}")
// 移除旧的离开播放新的
waitBroadData.remove(sameData)
CallerLogger.d(TAG,"移除待广播:有新的结果${tempData}")
}else if(sameData is AdvertiseCallbackWithData){
CallerLogger.d(TAG,"找到重复数据、正在播放中马上关闭${tempData}")
// 离开结束播放
sameData.close(false)
CallerLogger.d(TAG,"停止广播:有新的结果来进行广播${tempData}")
}
}
}
// 站点不一样 关闭所有的广播并设置新的站点id
if(tempData.siteId!= broadCastSite){
CallerLogger.d(TAG,"停止广播:站点切换停止广播_通过广播内容检测")
CallerLogger.d(TAG,"站点不一样 清理所有广播")
closeAllBroadCast()
waitBroadData.clear()
this.broadCastSite = tempData.siteId
}
// 来了新的广播 关闭播放时间最长的一个广播 并放入未使用列表
if(callbackListUsing.size>=5){
// 停止播放 播放时间最长的callback
val currentTime = System.currentTimeMillis()
// 找出播放时间最长的那个广播
var maxTime = 0L
var maxBroadCallback:AdvertiseCallbackWithData?=null
callbackListUsing.forEach {
@@ -105,7 +109,7 @@ object AdvertisManager {
if(maxBroadCallback!=null){
// 添加到当前站点的待播放数据
maxBroadCallback?.close()
CallerLogger.d(TAG,"停止广播:有新的核销切当前广播数大于5${tempData}")
CallerLogger.d(TAG,"正在广播的数已满需关闭广播时间最长的时间${maxTime}${tempData}")
}else{
// 放到最后一位
waitBroadData.add(tempData)
@@ -136,7 +140,8 @@ object AdvertisManager {
.build()
//扫描响应数据(可选,当客户端扫描时才发送)
val scanResponse = AdvertiseData.Builder()
.addServiceData(ParcelUuid(tempData.uuid), tempData.data.toByteArray()) //服务数据,自定义
.addServiceUuid(ParcelUuid(tempData.uuid))
// .addServiceData(ParcelUuid(tempData.uuid), tempData.data.toByteArray()) //服务数据,自定义
.build()
if(mBluetoothLeAdvertiser == null) {
val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
@@ -149,7 +154,7 @@ object AdvertisManager {
private fun findSampleOrderAndReplace(tempData: BleBroadCastData):Any? {
// 正在广播的
callbackListUsing.forEach {
if(isSampleOrder(it.dataInnser.uuid,tempData.uuid)){
if(isSampleOrder(it.dataInnser?.uuid,tempData.uuid)){
return it
}
}
@@ -163,14 +168,14 @@ object AdvertisManager {
}
// 是否是同一个UU
fun isSampleOrder(oleUuid:UUID,newUUID: UUID): Boolean {
val oldOrderId = oleUuid.toString().substring(0,22)
private fun isSampleOrder(oleUuid:UUID?,newUUID: UUID): Boolean {
val oldOrderId = oleUuid?.toString()?.substring(0,22)
val newOrderId = newUUID.toString().substring(0,22)
return oldOrderId==newOrderId
}
class AdvertiseCallbackWithData(val data:BleBroadCastData): AdvertiseCallback() {
var dataInnser = data
var dataInnser:BleBroadCastData? = data
var broadCastDate: Disposable?=null
var startTime:Long = 0
@@ -198,13 +203,16 @@ object AdvertisManager {
callbackListUnUse.add(this)
}
if(reUse) {
waitBroadData.add(0, dataInnser)
if(dataInnser!=null) {
waitBroadData.add(0, dataInnser!!)
}
}
stopBroadCast(this)
}
override fun onStartFailure(errorCode: Int) {
super.onStartFailure(errorCode)
OchChainLogManager.writeChainLogBluetooth("广播","启动广播失败")
if(callbackListUnUse.size+ callbackListUsing.size<5) {
callbackListUnUse.add(this)
}

View File

@@ -9,6 +9,7 @@ import android.bluetooth.le.ScanSettings
import android.os.ParcelUuid
import android.util.Log
import com.mogo.och.common.module.manager.bluetooth.bean.BleBroadCastData
import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager
import com.mogo.och.common.module.utils.RxUtils
import java.util.UUID
@@ -153,7 +154,7 @@ object BleManager : BaseBluetoothManager() {
uuidString.substring(16, 20) + "-" +
uuidString.substring(20, 32) // 构造一个标准的 UUID 字符串
val uuid = UUID.fromString(uuidWithDashes)
OchChainLogManager.writeChainLogWriteOff("核销结果","uuidWithDashes:$uuidWithDashes")
AdvertisManager.startOneAd(BleBroadCastData(data,uuid,siteId))
}