Learning python 系列9

这几天开始一个最大的工程,就是protocol,middleware等等。首先还是从protocol.py 开始。
BufferingStateMachine类是从object,protocolProtocol继承,为什么要从protocol.Protocol继承呢?这个是需要讨论的问题。
这个类有成员:__init__(self,device)
device:来自于参数。
custom:来自于device.custom
cmd:
state='idle'
idlebuf=""
waitbuf=""
notifications=defer.DeferredQueue().
支持的方法有:
_timeout_eb(self):对于AT timeout,调用notify_failure.
cancel_current_delayed_call(self):如果cmd.callID.active,调用那个cmd.callID.cancel().
notify_sucess(self,foo):取消all delayed calls,并且调用cmd.deferred.callback(foo).
notify_failure(self,failure):取消所有的delayed calls,调用cmd.deferred.errback(failure).
set_cmd(self,cmd):确认state='idle',把cmd给self.cmd,调用reactor.callLator()返回给cmd.callID.并设置状态'waiting'.
set_state(self,state):把制定state给self.state.
transition_to_idle(self):cmd=None,把状态重新成idle,并且idlebuf,waitbuf都是空的。
send_splitcmd(self):没有实现。
enqueue_notification(self,klass,*arg,**kwds):由klass构造对象n,然后用self.notifications.put()函数把n放入队列中。
dataReceived(self,data):把state='handle_'+self.state,然后通过getattr()调用那个handle_state.
process_notifications(self,buffer):确认device.custom和device.custom.async_regexp不为空。
调用re.finditer在buffer中用async_regexp的正则表达式查找:name,value=matchi.groups().
如果name是在custom.signal_translations中,用name取得signal,和function.调用function...
然后调用enqueue.notification(N.UnsoliciteNotification,signal,args).
删掉match的地方。buffer=buffer.replace(match.group(),'',1)并且返回buffer.
handle_idle(self,data):
1.self.idlebuf +=data,
2.调用process_notifications来处理最可能的unsolicited Notificications.
3.也可能是NEW_SMS,找到index,wherem然后一样调用enqueue_notification(N.NewSMSArrived.index,where)来放入队列。
4.可能是STK_DEBUG,直接代替就好。
5.CREG_REGEXP,取得status,调用self.notification(N.NetworkRegNotification,status).
6.或者CALL_RECV,queue it as N.CallNotification,每一步操作都可能替代。
handle_waiting(self,data):
1.waitbuf+=data
2.调用proess_notifications()来处理最可能的unsolicited Notifications.
3.从custom.cmd_dict[]中取得cmdinfo.在waitbuf中search cmdoinfo['end'].
4.对'echo','extract'等等的正则表达式操作。最后都是进入transition_to_idle.
觉得这个例子,真的是正则表达式的范例阿。

SIMProtocol是继承于BufferingStateMachine.拥有父类的一切。
新增加成员变量:
queue=defer.DeferredQueue()
mutex = defer.DeferredLock().
重载了方法__repr__.
translation_to_idle(self):
调用父类的同名函数,并release mutex,并且调用_checkqueue.
send_splitcmd(self):调用transport.write(self.cmd.splitcmd).transport的机制是什么?
_process_at_cmd(self,cmd):获得mutex,并且添加callback:transiton_n_send().
_check_queue(self):对queue调用那get,让callback处理。
queue_at_cmd(self,cmd):把cmd放入Queue中,返回cmd.deferred.

在SIMCardConnection之前,先看一下ATCmd类。
__init__(self,cmd,name=None,eol='/r/n'):
self.cmd=cmd+eol.
self.name=name.
self.deferred=defer.Deferred.
self.timeout=15
self.callID=None
我们使用这个类来构造AT cmd结构。

SIMCardConnection是继承于SIMProtocol的类,主要是处理AT命令。
add_contact(self,name,number,index):
构造AT+CPBW=.....的命令,调用那个queue_at_cmd(cmd)来完成。返回cmd.deferred.
change_pin(self,oldpin,newpin):
check_pin(self):
delete_all_contacts(self):取得get_used_contact_ids()的defer,添加callback:而这个cb,是调用delete_list_contacts().
delete_list_contacts(self,clist):返回defer.gatherResults(...).which调用delete_contact().
delete_contact(self,index)构造ATCmd,queue_at_cmd.返回cmd_defer.
delete_all_sms(self):取得get_used_sms_ids的defer,并且添加cb:which call delete_list_sms(used).
delete_list_sms(self,smslist)和delete_list_contacts相同。which call delete_sms.
delete_sms(self,index):构造AT cmd,并且queue at cmd返回cmd.deferred.
disable_echo(self):
disable_pin(self,pin):
enable_pin(self,pin):
find_contacts(self,pattern):
get_contact_by_index(self,index):
get_contacts(self):
get_available_charset(self):
get_card_version(self):
get_card_model(self):
get_charset(self):
get_imei(self):
get_imsi(self):
get_manufacturer_name(self):
get_netreg_status(self):
get_network_inf(self):
get_network_names(self):
get_roaming_ids(self):
get_free_contact_ids(self):
调用get_contacts,添加callback,errback.
get_next_contact_id(self):取得get_free_contact_ids(),然后填加callback:free.popleft().
get_signal_level(self):
get_sms(self):
get_sms_by_index(self,index):
get_smsc(self):
get_phonebook_size(self):
get_pin_status(self):
get_used_contact_ids(self):对self.get_contacts()的defer添加callback.
get_used_sms_ids(self):
register_with_network(self,netid,mode=1,format=2):
reset_settings(self):
save_sms(self,number,text):
send_at(self,at_str)
send_pin(self,pin)
send_puk(self,puk,pin)
send_sms(self,sms):
set_charset(self,charset):
set_netreg_notification(self,val=1):
set_network_info_format(self,mode=0,format=2):
set_sms_format(self,format=1)
set_sms_indication(self,mode=2,mt=1,bm=0,ds=0,bfr=1).
set_smsc(self,number)

其他更多的内容明天在继续,这里就是有关太多的defer,callback还是么有完全了解其中的内容。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值