python socket 不阻塞,不卡在缓冲区,不等待对方消息回复发送第二条命令

我先吐个槽!等我研究明白了我整理好了给你们,下个人别入坑了 太难受了,至少还有能说明一下的

遇到了个棘手的问题我要对接一个卡池这个卡池用的是C语言去写的

第一个坑!

研究了好久,我怎么对接?sokcet?嗯,最后我用socket对接成功了这个卡池,虽然这个问题是个沙雕问题
但是以前不是没接触过么。。。。。
tcp	客户端
	我作为客户端连接他,也可以,这个卡池在一直监听,可是就像下面说的,我得通过http将卡池参数发回去
	客户端的话每次连接都是一个问题!很慢!
udp	
	也可以,不过发任何消息都没有返回值
tcp	服务端
	我作为服务端也可以,但是问题是我需要一直运行这个卡池,我究竟怎么样才能让这个socket永远的连接上
	不断开,我需要写一个基于flask的框架,通过这个框架请求卡池的参数,我怎么样才能做到不断开,并且能够
	给他发指令.................................思考中

第二个坑!

这个卡池有的指令发送过去没有回复!
是的没有回复!我有时需要发送一连串指令,就拿几个参数,可是有的没有回复!
那么问题来了!socket是阻塞的!!
当我发出一条数据的时候得收吧?哎人家不给我发消息,那么我就一只收!!!(阻塞了,下一次命令发不了了)
你们也可以说,你可以用多线程对吧,是啊 我用线程,比如我需要连续发10条命令
十个线程防止阻塞是吧,任务结果怎么取,十个命令,卡池有256个卡。
那你就用携程,协程也行啊,256个卡,十个卡池。

第三个问题 粘包!

粘包我怎么处理?写这个卡池的我还不认识,公司直接拿过来用的
我粘包怎么去解决?我这定义好了几个字符,他是怎么写的??
服了 - - 我怎么他是怎么写的规定怎么解决粘包?

第五个坑 命令

对接这个卡池的命令极少!
我是个做 Web的 然后突然给我了一个自定义协议的,这个我忍了我看看弄弄就行了
这个协议用十六进制字节流传输的,那我也照做了 , 兄弟!你对这个设备操作的命令那么少 你让我猜吗?
猜吗?
对 ,人家规定了这个协议ISO-7816  我..... 我看了我确实看了,大概率没看懂吧,看一半还得接着看
但是十个厂家的卡池,十个不同的指令!哥哥你这个卡池是啥呢?
服!
--> AA 66 00 01 02
<-- AA 44 00 00 04 56 30 35 33
 查询设备所有SIM卡工作状态 (1卡工作中,2卡、256卡未启 ,4卡异常,其它
未插卡)
--> AA 66 00 01 03
<-- AA 44 00 01 00 AA 55 00 FF ...... 55
 告诉设备第38卡异常
--> AA 66 25 01 04
<-- 无
 启动第101张SIM卡 (返回ATR)
--> AA 66 64 01 FF
<-- AA 55 64 00 11 3B 3D 94 00 32 06 01 12 00 00 86
60 61 10 80 00 07
 停用第100张SIM卡
--> AA 66 63 01 00
<-- 无
 向第102张SIM卡发命令 A0 A4 00 00 02
--> AA 66 65 05 A0 A4 00 00 02
<-- AA 55 65 00 01 A4
=>AA661101FF (启动第18个SIM卡)
<==AA 55 11 00 16 3B 9F 95 80 1F C3 80 31 E0 73 FE 21 13 57 86 81 02 86 98 44 18 A8
==>AA661105A0A4000002
<==AA 55 11 00 01 A4
==>AA6611023F 00
<==AA 55 11 00 02 9F 17
==>AA661105A0A4000002
<==AA 55 11 00 01 A4
==>AA6611022FE2
<==AA 55 11 00 02 9F 0F
==>AA661105A0B000000A
<==AA 55 11 00 0D B0 98 68 00 34 91 41 28 91 60 63 90 00
(第17个SIM卡的ICCID: 89 86 00 43 19 14 82 19 06 36)
2. 用卡池发协议读第256个SIM卡IMSI号过程
==>AA66FF01FF (启动第256个SIM卡)
<==AA 55 FF 00 15 3B 9E 94 80 1F 47 80 31 A0 73 BE 21 11 66 44 4D 54 22 01 00 26
==>AA66FF05A0A4000002
<==AA 55 FF 00 01 A4
==> AA66FF027F20
<==AA 55 FF 00 02 9F 17
==>AA66FF05A0C0000017
<==AA 55 FF 00 1A C0 00 00 00 00 7F 20 02 00 00 00 00 00 0A 93 00 30 04 00 83 8A 83 8A
00 90 00
==>AA66FF05A0A4000002
<==AA 55 FF 00 01 A4
==>AA66FF026F07
<==AA 55 FF 00 02 9F 0F
==>AA66FF05A0B0000009
<==AA 55 FF 00 0C B0 08 49 06 10 89 49 10 63 51 90 00
(第256个SIM卡的IMSI: 08 49 06 10 89 49 10 63 51)
3. 用卡池发协议发送第2个SIM卡的GSM鉴权过程
==>AA660101FF (启动第256个SIM卡)
<==AA 55 01 00 14 3B 9D 95 80 1F C7 80 31 E0 73 FE 21 13 65 15 09 63 86 83 A1
==>AA660105A0A4000002
<==AA 55 01 00 01 A4
==> AA6601023F00
<==AA 55 B0 00 02 9F 17
==>AA660105A0A4000002
<==AA 55 01 00 01 A4
==> AA6601027F20
<==AA 55 B0 00 02 9F 17
==>AA660105A088000010
<==AA 55 01 00 01 88
==>AA66011012305263415263524195637485967463 (送随机数)
<==AA 55 01 00 02 9F 0C
==>AA660105A0C000000C
<==AA 55 01 00 0F C0 50 89 06 FE 24 EC FE 3A 22 90 BD 8C 90 00
(第2个SIM的 GSM鉴权结果,3G使用双向鉴权,激活过程较复杂,这里不再举例)

哎! 你还不举例了哥 ....

生活就这样, 我在研究研究,吐个槽 哎.....

最后我用的是非阻塞,一条线程

data =  self.new_socket.recv(1024, 0x40)
        self.return_msg = binascii.b2a_hex(data).decode('utf-8')
    except BlockingIOError as e:
        self.return_msg = ''
源码
	 def recv(self, bufsize: int, flags: int = ...) -> bytes: ...
后面参数可不需要等待
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值