分类归档 IT小常识

通过孟繁永

宽带垄断,依然难破

最近办公室的网挂了,挂的很彻底,一个搞不请到底是电信通还是联通几级代理的提供商和下级之间打了起来,互相掐网。

我为了能让联通接入进来,依据一个文件的指示,开始投诉。

这个文件并不是这几年第一个,搞不清楚是第几次了。文件本身质量并不高,虽然描述了各个部门的职责,但真不知道该从哪里下手。

文件原文看这里:http://www.gov.cn/zhengce/zhengceku/2020-10/06/content_5549492.htm

工业和信息化部 公安部 住房和城乡建设部 国务院国有资产监督管理委员会 国家市场监督管理总局

关于开展商务楼宇宽带接入市场联合整治行动的通告

工信部联通信函〔2020〕211号

为进一步规范商务楼宇、办公建筑、园区等场所(以下统称商务楼宇)宽带接入市场,打通提速降费梗阻,保障宽带用户合法权益,不断优化中小企业发展环境,工业和信息化部、公安部、住房和城乡建设部、国务院国有资产监督管理委员会、国家市场监督管理总局决定自2020年10月至2021年6月组织开展商务楼宇宽带接入市场联合整治行动。现将有关事项通告如下:

一、电信运营企业及其业务代理,商务楼宇产权人及其委托的管理人、物业服务企业不得签订任何形式排他性质的宽带接入协议或约定,不得强制商务楼宇承租人接受指定服务并收费,不得阻止电信运营企业根据用户需求进入商务楼宇提供公共电信服务,不得约束限制电信运营企业公平接入和使用商务楼宇内通信配套设施。

二、电信运营企业及其业务代理应在商务楼宇内醒目位置公布服务项目、服务内容、收费标准、服务监督电话和市场监管投诉举报电话等。商务楼宇产权人及其委托的管理人、物业服务企业应向各电信运营企业及其业务代理平等开放商务楼宇内通信配套设施,应在商务楼宇内提供专门醒目位置,为电信运营企业及其业务代理公布宽带接入服务信息提供便利。

三、电信运营企业及其业务代理为用户提供通信服务时,除按照其已公示的电信资费标准收费外,不得另行收取其他费用。商务楼宇产权人及其委托的管理人、物业服务企业在配合提供通信接入服务时,不得向电信运营企业及其业务代理收取公示的收费项目之外的费用。

四、2017年4月1日后新建商务楼宇的建设单位应严格执行《综合布线系统工程设计规范》(GB50311)及相关标准,将楼内通信配套设施纳入建设项目的设计文件,所需投资应纳入建设项目概算,并随建设项目同步设计、同步施工、同步验收,不得由第三方公司作为单独工程项目进行投资建设并经营获利;设计单位、施工图审查机构应严格按照国家标准要求进行设计和审查;新建商务楼宇的通信配套设施未按要求竣工验收或验收不合格的,电信运营企业不得将其接入公共电信网。

五、各省(自治区、直辖市)通信管理局、公安、工业和信息化、住房和城乡建设、市场监管部门要加强对商务楼宇宽带接入市场违法行为的监管和处罚。

通信管理局会同住房和城乡建设部门对电信运营企业或其代理商与商务楼宇产权人及其委托的管理人、物业服务企业达成排他性协议或约定,以及限制平等接入等行为进行查处。通信管理局依法对无证经营、超范围经营电信业务等违规行为进行查处。住房和城乡建设部门、通信管理局依照职责加强对商务楼宇建设单位、设计单位、施工图审查机构的监督管理。市场监管部门依法对相关市场主体存在的商业贿赂不正当竞争、价格违法等行为进行查处,涉嫌构成垄断行为的,严格依法处理。对以暴力、威胁手段,强迫他人接受指定电信业务服务,或者强迫电信运营企业及其业务代理退出电信业务服务,情节严重,涉嫌强迫交易罪或者其他犯罪的,由公安机关依法严厉打击。

特此通告。

工业和信息化部

公安部

住房和城乡建设部

国务院国有资产监督管理委员会

国家市场监督管理总局

2020年9月30日

首先想到的是找通信管理局投诉,于是找到http://bjca.miit.gov.cn/n817064/n817255/n1096242/index.html这个地址,提交投诉,一直没消息。这个页面做得也很应付事儿,完全没有必要强制限制用户阅读条款,等待那么长时间才能点确认投诉,而且我提交了之后查询结果还要再等一遍。

后来,找到了工信部的投诉,在首页http://www.nsae.miit.gov.cn/点“电信申诉”跳到这里https://yhssglxt.miit.gov.cn/web/,下面有个各省局,选北京之后又回到了北京通信管理局。

其实,点顶部导航的“用户投诉”就对了,填写到投诉对象的时候,我发现我找不到现在的运营商,于是转念一想,既然我想接入联通,就投诉联通吧。

没想到,工信部这个响应挺快,联通很快就来电话了,最终指派到了附近的营业厅来处理。

接下来的进展后面再写。

通过孟繁永

为什么不应该庆祝gitee比github更快

有搞开发的同事庆幸gitee速度很快,但也有同事提醒github打包下载代码更快。

找有用的新的项目肯定还是github优先,当github被限速越来越严重的时候,获取好项目的机会就越来越低,何况,自己的网连阿里云都会很慢,这样的办公条件有什么好庆幸的呢?

尽管我也不怎么在github上贡献代码,至少还点个真实的star,我不想在一个充斥者虚假的商业开源代码的gitee上浪费太多时间。

通过孟繁永

前后端分离的微信开放平台网站应用实现微信登录的本地调试

前面那一篇说了基于laravel+vue的实现方式和不要踩的坑,这一篇记录一下如何实现本地调试和线上部署。

当然,线上就按上一篇就好了,在vue-wxlogin里面配置appid(微信开放平台里面的网站应用的appid,需要先申请),laravel里需要配置appid和secret。

现在主要说一下如何在本地调试。vue-wxlogin显示二维码的时候需要appid和回调地址一致,如果把线上域名反向隧道到本地,那么线上就用不了,如果用本地的hosts来解析,那么就无法同时访问线上的版本。所以比较好的办法是专门申请一个测试用的网站应用,比如portal.local.futuremeng.com,通过vi /etc/hosts添加127.0.0.1 portal.local.futuremeng.com来将这个域名解析到本地环境。

然后在本地的nginx中添加一个站点,配置文件如下:

server {
     listen 80;
     server_name portal.local.futuremeng.com;
     charset utf8;
     location / {
        proxy_pass http://192.168.2.180:6060/;
        add_header Content-Security-Policy "script-src 'self' 'unsafe-inline' 'unsafe-eval'; object-src 'self'; style-src 'self' 'unsafe-inline';";
        proxy_set_header Host            $host;
        proxy_set_header X-Real-IP       $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }
}

其中,IP换成你自己的电脑的IP,如果是docker跑的nginx,需要指定为本机的局域网IP,也就是docker的宿主机IP,否则,如果设置成127.0.0.1是访问不到后面在vscode中建立的服务的。

最后打开vscode,打开vue项目,设置一下devServer的port,我用6060是为了同时npm run serve起多个前端项目,而这一个专用这个端口,以便nginx这里能够保持可用。

通过孟繁永

前后端分离的微信开放平台网站应用实现微信登录

先说下项目结构:前端vue,后端laravel。

其中前端用vue-wxlogin这个组件来显示微信登录的二维码。

这个组件中的appid填写微信开放平台中的网站应用的appid,redirect_uri填写微信开放平台中的网站应用登记的授权回调域。

这个授权回调域可以和网站应用的应用官网相同,也可以不同。

只要appid和redirect_uri与网站应用中的一致,二维码就可以显示。

为了调试方便,我在本地调试时把网站应用登记的授权回调域临时修改为另一个域名(该域名做了反向隧道,不知道是否必要)。

当二维码能正常显示时说明前端没有问题了。微信扫码确认后前端页面会跳转到redirect_uri(网址赋值需要用encodeURIComponent来编码一下,否则path可能会出错,比如hash模式时path跑到问号后面去了),跳转后的url会带上code参数。

接下来我们需要用这个code来换取openid和access_token。那么这就涉及到redirect_uri应该用前端域名还是后端域名呢?

我设置的是前端域名,也就是前端的login页显示二维码,然后扫码后跳转到weixin页,读取code并向后端接口发起获取openid的请求。这样,一则前端跳转时是本域跳转,不用重新加载页面,二则,也比较符合前后端分离的模式设计。

后端在code获取openid和access_token这里,我陷入了极大的困惑。后端我引入的是overtrue/laravel-wechat,其中有open_platform的接口,我以为可以像公众号和小程序的接口那样直接调用,比如

$this->app->handleAuthorize($input['code']);

就可以搞定了,但就在这一个方法上,我浪费了一个下午的时间。

具体不展开说了,可以参考https://blog.csdn.net/qq_39859060/article/details/83512563,但其实就算有这篇文章,我还是没搞清楚到底怎么回事,这个component_verify_ticket到底有什么用呢?

最后,是按https://learnku.com/laravel/t/36118#reply164754里面提到的第一种方法实现的。简单的一个file_get_contents就搞定了。

$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" . config('wechat.open_platform.default.app_id') .
            "&secret=" . config('wechat.open_platform.default.secret') . "&code=" . $input['code'] . "&grant_type=authorization_code";
 $jsonResult = file_get_contents($url);
 $data = json_decode($jsonResult, true);

再次吐槽微信难道从上到下都是跟张小龙一样的狗屎脑子吗?起名字和写文档都一样乱。

通过孟繁永

远程OBD是什么?

基于4G全网通信技术的车载WIFI热点OBD设备

通过OBD接口采集汽车ECU相关数据同时集成GPS定位,并通过4G网络将数据上传服务器,提供车载WIFI、车辆体检、车辆轨迹、精确的行程报告、油耗分析、驾驶行为分析等功能的智能汽车车载终端。

(1)即插即用、安装方便简单、支持远程升级、串口升级等各种升级方式。

(2)工业级模块,适合长期连续工作,抗干扰能力强。

(3)支持TDD-LTE和FDD-LTE,移动联通电信全网通,支持车载WIFI高速上网,同时最多接入10个终端设备上网。

(4)自动识别,支持车辆诊断协议,实时了解车辆的当前工作状态。

(5)内置GPS可以实现精准定位车辆具体位置。

(6)内置3D加速度传感器。

(7)设备自动转弯补偿、高速补偿,保证轨迹平滑顺畅。

(8)大容量FALSH存储,盲区数据自动补传。

(9)点火熄火报告,熄火自动休眠,低功耗。

(10)精准里程分析、油耗分析,不仅提供单次行程的里程油耗分析,还提供超速、高速、中速、低速、怠速的里程油耗分析。

(11)驾驶行为分析:设备提供急加速、急减速、急加油、急转弯、长时间怠速、超速、疲劳驾驶等的实时提醒,可以准备的分析出超速/高速行驶的时间、里程比例,车主行驶的时间和里程等。

(12)支持车辆体检、汽车发动机故障、保养提醒、节气门清理、电瓶亏电、超速、疲劳、冷却液温度高等10多种报警。

以上来自网络。

OBD最初是为了安全驾驶而出现的,随着环保要求越来越高,也成为环保检查的一种手段。但是看到其中的联网,还是有些恐怖的,车联网将GPS定位数据及车况数据实时上传。这是上行链路,同时,也可以基于这个通道完成下行控制。之前传播过一轮的远程控制汽车的零点其实不是未来,而是现实。

一个被破解了的汽车可能随时出现被控的“意外车祸”。技术上貌似不用太复杂,伪造一个基站就行了,之前的2G、4G基站伪装技术已经很成熟,现在的5G基站也不是什么太难的事情,貌似协议本身的漏洞依然存在。

其实,只要这个OBD像飞机的黑匣子一样只要收集了数据并且加上防篡改装置,就可以在查缉时通过有线连接获取或者即时开启无线链路来获取数据,没有必要一定实时上传。而且,真的故意躲避的,自然有办法屏蔽联网信号,造成上传故障,这个逻辑仍然是只管好人,不管坏人。但是让好人大大的增加了暴露的风险。

这些装置已经广泛的植入各种机动车辆,对于重型工业或者商用车辆还好,但装在旅居车或者家庭用的新能源汽车上,总觉的对个人隐私侵犯过多。不知道当时这政策出台的时候是如何通过的。

参考:

5.1 国六重型车远程排放监管要求
2018 年 8 月发布的《重型柴油车污染物排放限值及测量方法(中国第六阶
段)》(GB 17691-2018)标准中规定,从 6a 阶段开始,车辆应装备符合附录 Q
要求的远程排放管理车载终端,鼓励车辆按本标准附录 Q 要求进行数据发送。
从 6b 阶段开始,生产企业应保证车辆在全寿命期内,按本标准附录 Q 要求进行
数据发送,由生态环境主管部门和生产企业进行接收。
5.2 营运车辆在线监控标准
2011 年,交通运输部要求营运车辆必须与全国道路货运车辆公共监管与服
7
务平台进行联网,对运营车辆运行位置和时间进行监控,编制并实施了《道路运
输车辆卫星定位系统》系列标准。该系列标准对营运车辆上报位置信息所需要的
车载终端、车载终端与平台的通讯协议、平台间通讯协议及平台功能进行了规范。
5.3 电动汽车在线监控标准
GB/T 32960《电动汽车远程服务于管理系统》标准于 2017 年正式实施。标
准包含三个部分:总则、车载终端和通讯协议及数据格式。总则(GB/T 32960.1)
定义了系统的术语和定义、总体结构和一般要求。车载终端(GB/T 32960.2)规
定了电动汽车远程服务于管理系统车载终端的技术要求和试验方法。通讯协议及
数据格式(GB/T 32960.3)规定了通讯中的协议结构、通讯连接、数据包结构与
定义及数据单元格式与定义。

来源:

http://www.mee.gov.cn/xxgk2018/xxgk/xxgk06/202004/W020200423368282417631.pdf

通过孟繁永

mac版edge有个致命bug:更新后损坏所有记住的密码

没法用了,只能作为临时的测试浏览器使用。

通过孟繁永

jenkins中更好用的webhook插件generic-webhook-trigger

具体用法不说了,很多,请自行搜索,比github插件啥的好用多了。

通过孟繁永

以docker的方式运行composer时报sh: git: not found

操作系统:ubuntu20

环境:https://github.com/yeszao/dnmp

在宿主机本地安装的jenkins,在jenkins中设置job,composer install,截取部分输出如下:

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Package operations: 8 installs, 0 updates, 0 removals
  - Installing sebastian/code-unit-reverse-lookup (2.0.2): Downloading (connecting...)Downloading (100%)             Failed to download sebastian/code-unit-reverse-lookup from dist: /tmp/composer/cache/files/sebastian/code-unit-reverse-lookup does not exist and could not be created.
    Now trying to download from source
  - Installing sebastian/code-unit-reverse-lookup (2.0.2): Cloning ee51f9bb0c

                                                                                                                                                          
  [RuntimeException]                                                                                                                                      
  Failed to clone https://github.com/sebastianbergmann/code-unit-reverse-lookup.git, git was not found, check that it is installed and in your PATH env.  
                                                                                                                                                          
  sh: git: not found                                                                                                                                      
                                                                                                                                                          

install [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--no-custom-installers] [--no-autoloader] [--no-scripts] [--no-progress] [--no-suggest] [-v|vv|vvv|--verbose] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--ignore-platform-reqs] [--] [<packages>]...

skipping non-regular file "vendor/bin/carbon"
skipping non-regular file "vendor/bin/commonmark"
skipping non-regular file "vendor/bin/php-parse"
skipping non-regular file "vendor/bin/psysh"
skipping non-regular file "vendor/bin/var-dump-server"
Finished: SUCCESS

直接在宿主机进到相应的项目目录执行composer install显示:

Cannot create cache directory /tmp/composer/cache/repo/https---repo.packagist.org/, or directory is not writable. Proceeding without cache
Cannot create cache directory /tmp/composer/cache/files/, or directory is not writable. Proceeding without cache

                                                                            
  [Composer\Downloader\TransportException]                                  
  Content-Length mismatch, received 44625 bytes out of the expected 604017  
                                                                            

require [--dev] [--prefer-source] [--prefer-dist] [--fixed] [--no-progress] [--no-suggest] [--no-update] [--no-scripts] [--update-no-dev] [--update-with-dependencies] [--update-with-all-dependencies] [--ignore-platform-reqs] [--prefer-stable] [--prefer-lowest] [--sort-packages] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--] [<packages>]...

这里的composer命令是通过在.bashrc中添加以下命令实现的:

# php7 composer
composer () {
    tty=
    tty -s && tty=--tty
    docker run \
        $tty \
        --interactive \
        --rm \
        --user www-data:www-data \
        --volume ~/dnmp/data/composer:/tmp/composer \
        --volume $(pwd):/app \
        --workdir /app \
        dnmp_php composer "$@"
}

提示找不到git,但显然是存在的,搜索发现可能是权限问题,就给~/dnmp/data/composer,还有/var/lib/jenkins/workspace目录改成777,问题解决。

通过孟繁永

OBS导播台的虚拟摄像头插件

OBS的官网上有win版的虚拟摄像头插件,可是我没有找到mac版的,在github上搜到了https://github.com/johnboiles/obs-mac-virtualcam

安装成功,但是,腾讯的微信和腾讯会议均不支持,无法选择摄像头。钉钉可以,而且默认就是虚拟摄像头。

通过孟繁永

[Jenkins]Error:403 No valid crumb was included in the request

最近在更新job的配置时经常出现以上的报错,开始还误以为是百度效率云的icode出了问题。跟百度效率云的团队反馈,对方一直没有响应,不知道是解散了(开个玩笑),还是觉得这不是个问题。

检索这个问题,发现很多文章都说取消全局安全配置中的CSRF Protection的勾选即可,但是我的jenkins里没有这个勾选框了。

然后又检索到https://www.cnblogs.com/kazihuo/p/12937071.html

Jenkins版本自2.204.6以来的重大变更有:删除禁用 CSRF 保护的功能。 从较旧版本的Jenkins 升级的实例将启用 CSRF 保护和设置默认的发行者,如果之前被禁用。

这篇文章给的办法是在启动jenkins时添加一个配置

-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true

来实现这个关闭。

但是这样很不优雅,尤其是我有两个jenkins,一个基本上是最新版,一个是为了兼容百度效率云的插件而保留的一个很老的版本。最新版是直接在服务器上跑的jar版本,老版本是用的docker。以上的方法就不好玩了。

所以受到https://stackoverflow.com/questions/49888756/how-do-you-disable-jenkins-csrf-with-script的启发,我安装了一个Strict Crumb Issuer插件,然后在跨站请求伪造保护这里,选择这个插件来工作,配置默认。保存就好了。