[6.8.0]
[fea] [使用蓝牙广播]
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user