import 'package:flutter_test/flutter_test.dart'; import 'package:eaimar/devices/bes/bes_f2f_protocol.dart'; import 'package:eaimar/devices/bes/bes_protocol.dart'; void main() { const token = [0x11, 0x22, 0x33, 0x44]; test('AA 6B / AA 6C 与探测区间', () { expect(BesF2f.enterFrame(token), [0xAA, 0x6B, 0x06, 0x02, 0x01, 0x11, 0x22, 0x33, 0x44]); expect(BesF2f.exitFrame(), [0xAA, 0x6C]); expect(BesCmd.switchesMode(0x6B), isTrue); expect(BesCmd.switchesMode(0x6C), isTrue); expect(BesCmd.switchesMode(0x6D), isFalse); expect(BesCmd.frame(BesCmd.faceToFaceStart), [0xAA, 0x66]); }); test('BB EB 双耳可用且经典链路保持', () { final ack = BesF2f.parseEnterAck( [0xBB, 0xEB, 0x07, 0x00, 0x03, 0x02, 0x01, 40, 0x03, 0x01]); expect(ack, isNotNull); expect(ack!.result, 0); expect(ack.bothEars, isTrue); expect(ack.frameMs, 40); expect(ack.classicKeep, isTrue); expect(ack.fwMinor, 3); }); test('广播 token 对不上就不是这副耳机', () { final ad = BesF2f.parseAdvertPayload( [0xF2, 0xF2, 0x02, 0x01, 0x11, 0x22, 0x33, 0x44, 0x80 | 70]); expect(ad, isNotNull); expect(ad!.ear, BesF2f.earLeft); expect(ad.battery, 70); expect(ad.charging, isTrue); expect(ad.tokenEquals(token), isTrue); expect(ad.tokenEquals(const [0x11, 0x22, 0x33, 0x45]), isFalse); expect( BesF2f.parseAdvertPayload( [0xF2, 0xF2, 0x02, 0x09, 0x11, 0x22, 0x33, 0x44, 0x10]), isNull); }); test('握手帧与下行音频耳位', () { expect(BesF2f.hello(token), [0xAA, 0x01, 0x06, 0x02, 0x11, 0x22, 0x33, 0x44, 0x01]); expect(BesF2f.sessionCfg(), [0xAA, 0x02, 0x03, 0x00, 80, 0x00]); expect(BesF2f.startStream(), [0xAA, 0x03, 0x00]); expect(BesF2f.exitEar(), [0xAA, 0x06, 0x00]); final down = BesF2f.audioDown( ear: BesF2f.earRight, flags: BesF2f.flagPlayBegin | BesF2f.flagFlush, seq: 0x0102, g722: const [0xAB, 0xCD], ); expect(down.sublist(0, 6), [0xAA, 0x91, 0x05, 0x52, 0x02, 0x01]); expect(down.sublist(6), [0xAB, 0xCD]); }); test('上行音频 OWN_VOICE 与序号', () { final frame = BesF2f.parseBle( [0xBB, 0x90, 0x05, 0x91, 0x02, 0x01, 0x10, 0x20]); final audio = BesF2f.parseAudioUp(frame!); expect(audio!.ear, BesF2f.earLeft); expect(audio.ownVoice, isTrue); expect(audio.seq, 0x0102); expect(audio.g722, [0x10, 0x20]); }); test('来电退出事件', () { final frame = BesF2f.parseBle([0xBB, 0x87, 0x02, 0x06, 0x03]); expect(frame!.op, BesF2f.opEvent); expect(frame.payload[0], BesF2f.evtExitRequest); expect(frame.payload[1], BesF2f.exitIncomingCall); expect(BesF2f.messageKey(BesF2f.errBusy), 'f2fEndOtherFeature'); expect(BesF2f.isExitAckOk([0xBB, 0xEC, 0x01, 0x00]), isTrue); }); }