2天快闪巴西圣保罗 – 第二天

第二天首先去的是本地的大市场,葡语 Mercadão Municipal de São Paulo 可以理解为一个自带大食代Food Court的大型农贸市场。作为一个农牧业大国,市场里的瓜果蔬菜和生鲜肉类看上去很不错

卖水果的小贩会热情地给你水果试吃。市场一楼基本都是水果和生鲜,偶尔有一些手工艺品。二楼就是大食代广场。从上往下看一楼的格局和中国的农贸市场并无两样。

即使是巴西大食代肯定也要吃肉,下面一大盆肉加上两瓶啤酒的价格是$192 巴西里拉,看过第一天游记可能还记得,我们第一顿饭一个人就要这个价。当然坐在Food Court里吃肯定和有统一着装的饭店不一样。

这份肉的分量非常到位,也没有出现肉下面铺满萝卜丝把食物垫高显得分量多的伎俩。两个成年人勉强吃完后表示已经没有能力再弄点烤串。此处应有肉的特写。

又一顿酒足饭饱之际开始了新一轮的散步消食。闲逛了下圣保罗的商场,总体上非生活必须品的物价并不便宜。商家愿意收美金现钞,就是汇率惨淡了点。在街头和商场里都发现了一些类似于豹子变形体的雕像,不知道有什么寓意。(第二张感觉像占满了花生碎应该挺好吃的)

超市和街头便利店看起来和中国大街小巷上的并无不同。但是仔细一看他们都有个共同点,就是有足球卖。随到随买随踢。

很快就到了第二天夜晚的飞机时间,临行之前肯定又是一顿巴西烤肉。这次找的自助烤肉店价格正在搞活动,价格对折后只要 $74 巴西里拉一个人,也就是 USD $13。

圣保罗总计逗留两个白天,吃了4顿巴西烤肉。飞行时间远大于在巴西境内的时间。考虑到他们给了我5年多次往返签证,应该在将来的某一天还会回去继续吃肉。

2天快闪巴西圣保罗 – 第一天

这是一篇拖了有半年多的游记,如果不是Covid19把所有人困在家里的话更不知道什么时候能够完成。一切都源于去年搜到的一张从温哥华出发去圣保罗的机票,大概就500加币的样子。考虑到从来没去过南美洲外加一圈mileage run下来里程不少就愉快订票。

订票后因为航空公司行程变化前后改动了几次。最终飞行路线是YVR-ORD-GRU 比原先的 YVR-DEN-IAD-GRU 少了一跳。当然我还要自己解决SFO-YVR这一段,就直接买了一个便宜单程接上。事后回程的SFO-YVR还被意外改成了SFO-LAX-YVR替我补上了后一次航班缺失的一段。

因为UA国际航线从加拿大出发比从美国出发便宜的缘故经常在YVR机场转机。这次找到了一家早餐店不错。名字叫“天津味 牛羊肉粉面” 英文名“O’Tray Noodle” 坐标在Aberdeen Plaza隔壁一幢看起来不怎么样的建筑。从机场有轻轨可以坐到Aberdeen Plaza步行几分钟就到。煎饼果子经天津的朋友远程图片鉴定表示质量不错。

抵达圣保罗机场已经是第二天清晨,机场入境排队感觉亚洲面孔寥寥无几。入境检察官问的都是常规问题。入境章上的停留日期是手写的90天。入境管对我飞24小时就为了待一个晚上就走有点将信将疑。这个跨越了半个地球的中国护照持有人究竟想来做什么?答案当然是烤肉

机场入境后第一感觉就是热,10月下旬还是南半球的夏天。抵达酒店checkin后第一件事就是找烤肉吃。手机上找了附近评价最高的自助烤肉店,过程就和平时常见的巴西烤肉一样。桌上有块牌子红或绿,绿色代表你还能吃,会有服务生不断带着新出炉的烤肉到你面前切给你。等到实在吃不下了就把牌子翻红就不来问你。烤肉店还有一个巨大的沙拉吧,里面居然还有不少三文鱼寿司。因为实在太饿了所以这顿饭并没有图。最后两个人的自助餐还带两瓶啤酒差不多$190 巴西里拉一个人,折合USD $35。和之后吃过的几家烤肉店比起来这家还算是档次高的,从服务生统一的着装和价格上可以看得出。

吃饱后自然要外出闲逛消食。鉴于之前在网上的阅读结果对圣保罗街头本地治安并没有太多信心,把钱包和iPhone护照都锁在酒店保险箱后就带着一张信用卡, 一张20美金现钞和一部Android手机出门。第一个目的地是圣保罗大教堂。Uber在圣保罗本地能正常用,而且车辆也不算少。

圣保罗大教堂本身相比在北美可以看到的各种教堂并没有给我留下特别深刻的印象。倒是教堂门前广场上形形色色的小生意人和随处可见的流浪汉让人叹为观止。旧金山人对于满街的流浪汉也已经习以为常,但这个密度和闲散人员的数量还是让人不由自主的捂紧钱包提高警惕。但从另一方面来说,没有警力或城管驱赶也说明了社会的和谐,流浪汉本身并不可耻,但为了国家/城市形象非要做出掩耳盗铃驱赶就没有必要了。

除了流浪汉外,广场上各种卖大力丸的生意人也不少。这位看了半天感觉应该是卖某种壮阳药物之类的。

广场上还发现了很多人围着看一个木板钉起来的大箱子。研究了一圈后发现是Netflix在播放电视Trailer。别看箱体巨大实际屏幕也就比手机屏幕大不了多少。

高架桥下的空间被建成一个个小型足球场,一群小孩在里面踢球。相比中国的高架桥下基本都是自行车停车场或是堆放杂物。中国的家长也未必会愿意让小孩在汽车尾气的环绕中踢球吧。没有足够的设施让大多数人能够参与又如何提高竞技水平呢?

Traefik v2 下设置反向代理及https redirect

为了解决docker前端的反向代理,在尝试了传统的haproxy后打算试一试新产品。Traefik的吸引力在于

  • v1和v2版本的配置语法不一样,阅读文档需注意
  • 配置可以通过启动参数或配置文件传入,但前者并没有完全实现后者的功能
  • 文档过于简陋
  • 可以自行更新 Let’s encrypt证书,避免3个月手工操作(即使用acme.sh 还是需要配置cron job)
  • 自动发现同一个docker instance上的服务并通过label来定义route/service
  • 多种多样的middleware 可以简单实现ratelimit或者replace path

缺点在于

下面是一个简单例子。docker-compose.yml 中有2个container,其中trafik找到了nginx的服务并且自动issue/renew了证书。

nginx:
    command: nginx -c /etc/netbox-nginx/nginx.conf
    image: nginx:1.17-alpine
    depends_on:
    - netbox
      #ports:
    expose:
      - 8080
    volumes:
    - netbox-static-files:/opt/netbox/netbox/static:ro
    - netbox-nginx-config:/etc/netbox-nginx/:ro
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.netbox_http.rule=Host(`netbox.fastobject.net`)"
      - "traefik.http.middlewares.https-redirect.redirectscheme.scheme=https"
      - "traefik.http.middlewares.https-redirect.redirectscheme.permanent=true"
      - "traefik.http.routers.netbox_http.middlewares=https-redirect"
      - "traefik.http.routers.netbox_https.rule=Host(`netbox.fastobject.net`)"
      - "traefik.http.routers.netbox_https.tls=true"
      - "traefik.http.routers.netbox_https.tls.certresolver=le"
      - "traefik.http.services.netbox-service.loadbalancer.server.port=8080"
  traefik:
    image: traefik:v2.1
    container_name: "traefik"
    command:
      --log.level=INFO
      --providers.docker=true
      --providers.docker.exposedbydefault=false
      --entryPoints.web.address=:80
      --entryPoints.websecure.address=:443
      --certificatesResolvers.le.acme.email=henryxxxxx@gmail.com
      --certificatesResolvers.le.acme.storage=acme.json
      --certificatesResolvers.le.acme.httpChallenge.entryPoint=web
    ports:
      - 443:443
      - 80:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

这里还实现了http 80 -> http 443 的自动302跳转。这个配置通过middleware实现,坑点在于需要配置2个route,分别针对http和https,否则跳转是404 not found。另一个容易被忽略的地方是需要被反向代理的container使用expose而不是ports来暴露端口。expose只会把端口暴露给其他container 而ports会把这个端口绑定在host上。在这个例子里只需要把端口expose给trafik即可。

在旧金山办理巴西签证

在旧金山办理巴西签证需要准备的材料如下

  • USPS money order $115 收件人写 Consulate General of Brazil
  • 2 inch x 2 inch 白底免冠照片一张
  • 驾照复印件
  • 美国有效身份证明,比如绿卡
  • 机票订单
  • 打印的在线申请表确认信

需要注意的是money order必需是USPS开局的。Safeway/Walmart的不行。

申请签证前需要在线填写申请表,网址在 https://formulario-mre.serpro.gov.br/sci/pages/web/pacomPasesWeb.jsf?aba=-6

这个网站的问题在于偶尔英文翻译里还会夹杂葡萄牙文,请备好翻译软件。填表的过程中也会让上传照片电子版和机票行程电子版,请一并准备。最后填写完成提交后会有一个带编号的确认页面需要打印并签字。

巴西驻旧金山领馆面签不需要提前预约,到了领号即可。需要注意的是签证服务仅在早9点到11点之间提供。停车的话最精生的选择是附近的St. Mary’s Square Parking Garage – Lot #49, Kearny Street, San Francisco, CA

巴西领馆网站说明是5个工作日下签证,但我面试的时候让我差不多7个工作后再去领。签证上的issue date是在5天内,也许只是工作人员为了留下足够的余量。

最后收到的签证是5年多次有效,每次停留不超过90天。

Keepalived实现廉价HA

最近在dockerize各种home lab上的服务,其中遇到的一个问题就是如何实现HA。最方便的实现方式是打开eBay.com搜索F5 Big IP 购买硬件Load Balancer。最廉价的方式是多个设备间跑VRRP协议实现自动Fail over切换。Keepalived 就是一个精细生活VRRP的软件实现。

具体用例为两台Docker node上各跑了一个container运行unbound提供recursive DNS服务。任意一台机器下线(不管是container下线或是node下线)都由另一台机器在同一个IP地址下继续提供服务。切换期间网络不不会中断。

既然已经有了两台运转正常的Docker node,显然Keepalived跑在Container里是最经济且便于管理的。这里用到的docker image是 https://github.com/osixia/docker-keepalived

需要注意的是两台机器的sysctl需要设置 net.ipv4.ip_nonlocal_bind=1 在Ubuntu上可以通过修改 /etc/sysctl.conf 并运行 sysctl -p /etc/sysctl.conf 实现。在RancherOS上需要修改cloud-config.yml 具体参考官方文档

并且这两个container需要跑在host network上且赋予 CAP_NET_ADMIN (--cap-add NET_ADMIN

以下是用docker-composer 和直接运行docker run的两种配置。

# docker-composer.yml

keepalived:
     container_name: keepalived
     image: arcts/keepalived:latest
     environment:
       - KEEPALIVED_AUTOCONF=true
       - KEEPALIVED_STATE=MASTER
       - KEEPALIVED_INTERFACE=eth0
       - KEEPALIVED_VIRTUAL_ROUTER_ID=2
       - KEEPALIVED_UNICAST_SRC_IP=10.2.1.10
       - KEEPALIVED_UNICAST_PEER_0=10.2.1.11
       - KEEPALIVED_TRACK_INTERFACE_1=eth0
       - KEEPALIVED_VIRTUAL_IPADDRESS_1="10.2.1.12/24 dev eth0"
     network_mode: "host"
     cap_add:
       - NET_ADMIN
# docker run command
docker run -d --name keepalived --net=host --cap-add NET_ADMIN \
-e KEEPALIVED_AUTOCONF=true               	\
-e KEEPALIVED_STATE=BACKUP           		\
-e KEEPALIVED_INTERFACE=eth0                \
-e KEEPALIVED_VIRTUAL_ROUTER_ID=2           \
-e KEEPALIVED_UNICAST_SRC_IP=10.2.1.11    	\
-e KEEPALIVED_UNICAST_PEER_0=10.2.1.10     \
-e KEEPALIVED_TRACK_INTERFACE_1=eth0        \
-e KEEPALIVED_VIRTUAL_IPADDRESS_1="10.2.1.12/24 dev eth0" \
arcts/keepalived

至此 IP地址 10.2.1.12 就由 10.2.1.10 为master ,10.2.1.10下线 则10.2.1.11 自动由backup转为master继续提供服务

在Cisco路由器上使用Let’s encrypt 证书

以下是一个笔记,用来更新Cisco 28xx系列路由器上的Anyconnect 证书

1. 生成Let’s encrypt 证书。我习惯用getssl

2. 加密private key 这台设备较老,只接受des加密的格式
openssl rsa -des -in privkey.pem -out privkey-enc.pem
这时候会要求输入一个密码,在下文会用到

3. 从private key中提取public key
openssl pkey -in privkey.pem -pubout -out pubkey.pem

4. 登陆到路由器并切换到配置模式

enable
configure terminal

5. 创建ISRG Root certificate trustpoint

crypto pki trustpoint ISRG_Root_X1
chain-validation stop
revocation-check none
enrollment terminal pem
exit

6. 导入ISRG Root certificate (从 https://letsencrypt.org/certs/ 下载)
crypto pki authenticate ISRG_Root_X1
粘帖复制证书后回车在新的一行键入quit

7. 创建中间证书 Let’s Encrypt Authority X3 (Signed by ISRG Root X1) 的trustpoint

crypto pki trustpoint Lets_Encrypt_Authority_X3_signed_by_ISRG_Root_X1
chain-validation continue ISRG_Root_X1
revocation-check none
enrollment terminal pem
exit

8. 同样粘帖复制中间证书 (从 https://letsencrypt.org/certs/ 下载)
crypto pki authenticate Lets_Encrypt_Authority_X3_signed_by_ISRG_Root_X1
粘帖复制证书后回车在新的一行键入quit

9. 导入路由器证书
crypto pki import host.domain.com-cert pem terminal @Password@
这里的@Password@ 替换为 #2 中自定义的密码
粘帖复制 Let’s Encrypt Authority X3 的中级证书,也就是在#8 中用过的。在换行后输入quit
粘帖复制 privkey-enc.pem 中的内容,注意不要有空行。在换行后输入quit
最后粘帖复制 #1 中创建的证书。在换行后输入quit
如果一切正常的话应该能看到
"% PEM files import succeeded."

10. 替换原有的证书
这里用到的gateway名字是我本机的,请根据实际情况输入

webvpn gateway gateway_1
ssl trustpoint host.domain.com-cert

90天过期前需要重新更新服务器证书并且重复 #10 步

参考文献
Tutorial: Get Let’s Encrypt on Cisco routers/switches

隐没在闹市中的珍宝 Granville Island

第一次去温哥华前就有朋友推荐过Granville Island上的Fish market。之后多次入境都与之擦肩而过,真正踏足这个小岛还是第一次。这还要归功于在Burrard Bridge下的一瞥。

在游船的尽头有几个大字招牌就是Granville Island Public Market。一开始以为从这个码头就可以步行抵达,绕了一圈才发现只有坐船或是开车绕道才能进去。这座岛三面环水,原本是两座沙洲,于1915年被填成35英亩的工业用地,随着经济大萧条一度沦为贫民窟直到二战期间再度投入大量生产。现在已经是温哥华著名旅游景点之一。

工业的痕迹依然可见,只不过加上了一丝艺术气息。

因为是工作日的关系岛上的停车并不困难,多个收费停车场都有空位根据车牌买停车票即可。岛上最著名的就是这个Public Market。

一开始以为只是一个Fish market或Farmer’s market,进去后才发现里面堪称一个宝库。

首先看到的就是各色水果蔬菜,五彩斑斓的摆放配合灯光映射让人垂涎欲滴。

有一个日本人开的鱼铺(也就是朋友推荐过的)有卖新鲜生蚝,如果有带上一把开蚝刀不妨买一瓶Tabasco调料带回住处慢慢品尝。看到这些虾米蟹腿肉此刻我只想吃一顿火锅。

往里走有一家巨大的茶店,可以买茶叶回去也可以现点一杯热茶当场冲泡。店主看上去是日裔,还会讲日语招待客人。

茶店的斜对角是一家马卡龙专营。第一次看到如此多品种花色的马卡龙在一个柜台展示。可以单买也可以选择6只,12只装(听上去有点熟悉?)

店的一角甚至还有一个马卡龙搭建的Eiffel Tower 不知道是不是属于非卖品

店招在此,看着这块招牌就找到了

迷你马卡龙金字塔,不知道这样一罐下去血糖会升多高。

市场另一角不乏各色面包三明治咖啡店,逛累了也可以坐下喝一杯再走。门外有不少供人歇腿的长凳。今年的枫树红得比往年更晚一些。可以点一杯热巧克力坐在门口看一天的鸽子,暂时忘却工作带来的烦恼。

在旧金山领事馆办理日本多次往返签证

根据日本外务省今年5/1开始的新政策,在海外的中国护照持有人满足条件的也可以办理日本国多次往返签证。鉴于日本领事馆在美国是分区管辖并且各自为政,具体每个领馆的要求各有不同。以下仅限于今年6月在旧金山领事馆办理的经验,并不具备普遍性。

官方网站关于中国护照申请多次往返签证的连接 http://www.sf.us.emb-japan.go.jp/itpr_en/e_m02_01_10.html

实际办理中收取了如下材料

  1. 护照原件 以及 4.5×4.5 方形照片一张
  2. 有效身份证明(有绿卡的需要提供复印件,并且它们会在检查原件后在复印件上盖验讫章;H1b需要提供I797原件和复印件以及I-94,持有EAD卡的需要提供EAD卡原件复印件)
  3. 三个月内的往返机票和酒店订单。一定要三个月内,否则会让你推迟到临行前三个月再来办理签证。
  4. 行程单一份,需要说明每一天去哪里做什么,并且当天住宿何处,联系方式
  5. 六个月银行账单。要求必须是连续六个月
  6. 最近两张paystub
  7. 签证申请表格(领馆网站有下载电子版)需要中文姓名以及身份证号
  8. 陈述信,说明为什么需要多次往返签证 (可以参照这个链接里的模版  http://dailynews.sina.com/gb/wapnews/discover/usa/20170530/144020114.html )

其中需要三个月内的机票酒店订单,以及六个月连续银行账单属于旧金山领馆特色要求。在收件后给的回执上可以看出准备给你S(单次)或M(多次)往返签证,价格分别是单次$27,多次$55。收现金不收信用卡或个人支票,取件时支付。一般3个工作日即可取件。

根据身边的经验,旧金山领馆签发的多次往返均为5年有效,每次不超过90天版本。洛杉矶领事馆有签发3年有效,每次不超过30天版本。YMMV

Android下设置国产流氓软件权限静默

同一个软件在iOS平台有的话首选iOS,权限控制更严格且程序无法作出反抗。如果遇到因为地区限制(比如某国产流媒体音乐服务软件仅限在中国市场下载)只能在Android上安装的话就需要手工设置部分权限静默。

以下内容参考了这篇文章

首先需要安装adb。MacOS下可以用homebrew
brew install android-platform-tools

开启手机usb debugging (Settings -> About phone -> Build number连续点击10次开启developer mode)
连接上手机后首先查找一下安装的软件包名。
在这个例子中用的虾米音乐
adb shell pm list packages|grep -i xiami
package:fm.xiami.main

得到结果是fm.xiami.main

之后用appops把某些权限设置为ignore。不能设置成deny因为程序在检测到没有获得该项权限时会拒绝服务(所以我们叫他流氓软件)设置成ignore的话程序无法detect到这个变化。不过第一次启动程序还是不得不授予所需的权限否则程序拒绝启动,这一点不知道是否将来有workaround。


adb shell appops set fm.xiami.main WRITE_SMS ignore
adb shell appops set fm.xiami.main OP_READ_PHONE_STATE ignore

这两个权限一个是发送短信另一个是读取电话信息权限。一个音乐软件要求电话管理以及发送SMS权限实属过分。

检查该软件获得的所有权限

$adb shell appops get fm.xiami.main
COARSE_LOCATION: ignore
FINE_LOCATION: allow; time=+21m35s704ms ago; rejectTime=+12m39s614ms ago
POST_NOTIFICATION: allow; time=+14m32s602ms ago
CALL_PHONE: ignore
WRITE_SMS: ignore; rejectTime=+15m8s617ms ago
WRITE_SETTINGS: default; rejectTime=+15m15s701ms ago
READ_CLIPBOARD: allow; time=+12m35s36ms ago
WRITE_CLIPBOARD: allow; time=+12m35s34ms ago
TAKE_AUDIO_FOCUS: allow; time=+18m42s431ms ago
TOAST_WINDOW: allow; time=+14m30s54ms ago; duration=+2s527ms
OP_READ_PHONE_STATE: ignore; rejectTime=+13m13s115ms ago
READ_EXTERNAL_STORAGE: allow; time=+15m7s9ms ago
WRITE_EXTERNAL_STORAGE: allow; time=+15m7s9ms ago
RUN_IN_BACKGROUND: allow; time=+3m11s711ms ago

其中FINE_LOCATION 设置ignore但不知出于何种原因无法生效。此外在权限后没有出现time的即意味着程序没有请求该项权限(我事先禁止了CALL_PHONE) 对于FINE_LOCATION,据 @yegle建议可以通过禁止RUN_IN_BACKGROUND 权限来达到程序关闭即无法探知用户位置实现。

Cisco 7941G IP Phone 刷SIP固件

托@lty1993 的福,最近入手了几台便宜的Cisco 7941G IP Phone,由此开启了刷机之旅。

默认情况下这部电话通过Cisco自家的Call manager系统来provison和管理。仅在固件升级到9.2 SIP之后才能连接标准的SIP服务器当作一部SIP Phone来独立使用。Cisco的各种文档里只描述了如何通过自家系统provison,对于如何通过TFP刷机之有寥寥数语。@lty1993 反复试验探索出了如下刷机方法,我在此做一份笔记,希望可以帮到(想淘便宜电话的)后人

首先要确定你的电脑固件版本,低于8.0的情况下没法直接升级。建议先做一个hard reset后从8.0固件刷起。方法是按住#键接电源,看到液晶屏右边选择两路线路的灯(以下简称两灯)黄色闪烁后放开,按3491672850*# 后机器下方耳机,静音,speaker(以下简称三灯)开始红色闪烁即开始了删除固件的过程。这个过程完成后电话开机液晶屏是完全不现实内容的,只有两灯交替闪烁绿色。

这个时候就要开始刷机。你需要一台TFT服务器根目录下放置电话固件内容(稍后会详细解释)。并且你的DHCP服务器需要添加一个额外的Option。code为150,value是转成16进制的TFTP server的IP地址。比如你的IP如果是192.168.66.3,那value就是0xC0A84203 注意前面的0x不能省略。这样做的目的是为了让电话在启动的时候通过DHCP拿到TFTP服务器地址从而进行固件升级。

根据无数次人肉实验得出的经验是固件升级可以跳级,但是必须遵循 8.0 (3)-> 8.5(2) -> 9.4(2) -> 9.2(2)[sip] 这个顺序。低于8.0的固件需要先做hard reset后才能刷入8.0固件。固件可以从Cisco网站下载。记得需要下载zip文件版本,文件解压缩后得到的文件放入TFTP服务器根目录。在Linux下我们尝试过tftp-hpa,在Mac OSX下有TftpServer都测试可以正常使用。

紧接着刚才提到的hard reset后两灯闪烁绿色情况。如果这个时候TFTP server开启并且DHCP option设置成功的话,你的电话应该能自动开始刷机。刚刚hard reset后升级液晶屏是没有显示的,但是电话右下角的三灯会慢慢地出现一个红色灯从左往右移动,这个过程会持续一分半钟。如果发现红色快速一闪而过那说明固件校验不合格或版本非法。

当升级8.0 成功后第一次启动就能看到液晶屏上又出现久违的Cisco字样。这时候可以准备更新TFTP上的固件并且拔掉电话电源。之后还是需要按着#键开机,并且在两灯黄色闪烁的时候soft reset,按键如下 123456789*0# 这个时候电话会立刻重启并且寻找TFTP服务器开始升级。在固件升级的同时可以在液晶屏上看到正在更新的文件和进度显示。

前三次升级 8.0, 8.5, 9.4的时候都只需要固件文件即可,最后一次升级9.4 SIP完成后开机会自动在TFTP服务器上寻找SIP服务器配置和dial plan配置文件。这个时候情确保TFTP server继续开启。这两个配置文件也是Cisco文档里找不到具体schema,全靠 @lty1993 人肉一点点摸索出来。其中SEPXXXXXXXXXXXX.cnf.xml 中的XXXXXXXXXXXX需要替换为电话的Mac地址其中字母全部大写。dialplan-XXXXXXXXXXXX.xml 文件名是在SEPXXXXXXXXXXXX.cnf.xml中指定的, 所以不一定需要叫这个名字,这里仅仅为了便于管理才保持同样命名规则。

下面是2个配置例子。基本上修改下服务器地址和extension/password就可以正常使用了。需要注意的是这部电话似乎只支持SIP TCP链接,而freepbx/asterisk默认是UDP,需要手工开启TCP支持,否则registering会一直注册不上。 <transportLayerProtocol>这个参数值为1即为TCP,2为UDP,默认是4(不知道是什么?也许是CM中某个协议?)

需要修改的地方还有EXTENSION_NUMBER 换成SIP服务器上真实的extension号码,比如100. <authPassword> 的值替换成账户密码。<dialTemplate> 的值替换为你的dial plan文件用户名。

至此当你的电话升级固件至9.2 SIP之后开机能读到正确的2个配置文件就应该能立刻注册上你的SIP服务。如果发现registering一直不过,首先检查你的服务器是否支持TCP连接。

Cisco网站固件下载地址
用户配置文件

配置文件修改还可以参考 这个网址

如果你在配置文件中发掘中了新功能不妨留言和大家分享一下,比如通讯录功能如果可以和LDAP连起来应该会很有意思。