Day20 让电脑透过数据机和有线、无线网路传递讯息

上一回讲的是透过数据机连结各种电脑周边
今天来分享数据机更强大的功能,传递讯息
可以先查询 modems 说明文件

help modems

可以看到 modem 的指令很简单,只有几个如下

  • open( channel )
  • isOpen( channel )
  • close( channel )
  • closeAll()
  • transmit( channel, replyChannel, message )
  • isWireless()
    以及一个 modem_message 事件

我们先试试用 Wired Modem 连接两台电脑
并且跟上次一样,两端的数据机都要按下滑鼠右键,让它出现红色框表示连结成功
接着可以自定义谁是传送端电脑,谁是接收端电脑
以下是我的参考程序码

传送端

传送端的 channel 不需要 open,这是实测结果,我也不知道为什麽
至於 replyChannel 则是可有可无,如果有打算接收回应,就需要 open,否则会收不到回应讯息
从程序码可看出,我这台电脑接了左右两台数据机,并各自连接一台电脑
也就是说,我可以同时传送讯息给多台电脑

senderChannel = 123     -- channel 自定义 0 ~ 65535
replyChannel = 456
-- modem.open(senderChannel)
print('modem is open: ' .. tostring(modem.isOpen(senderChannel)))
print('modem is wireless: ' .. tostring(modem.isWireless(senderChannel)))
modemLeft = peripheral.wrap('left');
modemRight = peripheral.wrap('right');
modemLeft.open(replyChannel)
modemRight.open(replyChannel)
modemLeft.transmit(senderChannel, replyChannel, "hello do you hear me ?")
modemRight.transmit(senderChannel, replyChannel, "how are you ?")

接收端

这是接收端的程序码,接收讯息的 channel 一定要打开,否则收不到讯息

senderChannel = 123
modem = peripheral.wrap('left');
modem.open(senderChannel)
print('modem is open: ' .. tostring(modem.isOpen(senderChannel)))
print('modem is wireless: ' .. tostring(modem.isWireless(senderChannel)))

event, side, senderChannel, replyChannel, msg, distance = os.pullEvent("modem_message")

print("event: " .. event)   -- 事件名称:modem_message
print("side: " .. side)     -- 哪个方向的数据机收到讯息:left, right, front, back, top, bottom
print("sender channel: " .. senderChannel)  -- 收到讯息的 channel: 123
print("reply channel: " .. replyChannel)    -- 可以回应讯息的 channel: 456
print("message: " .. msg)                   -- 收到的讯息内容
print("distance: " .. distance)             -- 两台数据机的距离

回应讯息

同样的,如果要回应讯息,就使用 transmit API 即可,不过 channel 顺序要对调

-- Reply message
modem.transmit(replyChannel, senderChannel, "I heared you")
-- 不打算继续收讯息,可以关掉特定数据机的 channel
peripheral.wrap(side).close(senderChannel)
-- 或是直接关闭所有 channel
peripheral.wrap(side).closeAll()

那麽,可以传送和回应都用一个 channel 就好吗?
当然可以~ 这部分其实就是玩家自定义规则即可,CC: Tweaked 只是留这个弹性给大家发挥

传输 table 结构资料

这部分,电脑也自动帮我们做好序列化、反序列化了,真是太强大了!
传输不需要任何加工,收到的时候也还是个 table 结构

modem.transmit(senderChannel, replyChannel, { 1, 2, 3 })

但是问题来了,如果每次要传送到远端的电脑,就要拉线,那不累死吗 ...
这跟实体世界的概念是一样的,都什麽时代了还在到处布线

Wireless Modem 登场

我们来试试 Wireless Modem,它的 API 用法跟 Wired Modem 其实是完全一样的
但是具有这样的优点

  1. Wireless Modem 不用布线
  2. 传送端只需要安装一台 Wireless Modem,就可以传送讯息给多个接收端

而它的无线传输可以多远呢?
我实际做了测试,如下图,接收端电脑在遥远的彼方 ... (远目)
CC: Tweaked Computer and Wireless Modem

在接收端收到讯息後,我将距离印出来,可以得知最远的传输距离,应该不会超过 64 格方块
CC: Tweaked Wireless Modem transmit distance

如果是原本的麦块世界,要拉 64 格距离的遥控
要一堆红石,中间还要穿插约 5, 6 个中继器,多累啊!
但是说到红石,我们可以透过红石机关操控麦块世界的全自动、半自动化
那电脑呢?总不能真的只是在麦块世界打电脑写 Code .....
这点 CC: Tweaked 也准备好了,可以参考
/rom/programs/redstone.lua
参考它一小段语法即可,也就是

redstone.setOutput('right', true)   -- 将电脑右方输出红石讯号!

我们可以在接收端电脑收到网路讯号後,接着启动红石讯号
接下来的应用就很丰富了,对吧!
CC: Tweaked Computer Redstone


<<:  Day 22 | 状态管理套件 MobX - 基本使用

>>:  【Day 20】Python 一行内输入多个数字、多个字串及好用的刷题网站推荐

30天零负担轻松学会制作APP介面及设计【DAY 19】

大家好,我是YIYI,今天我要来制做体重的页面。 点哪些地方可以进到这个页面呢? 第一个是从HOME...

Day 29 Sniffing & Spoofing 监听与欺骗 (dnschef)

前言 今天要体验的工具位於Kali的09-Sniffing & Spoofing分类,这类的...

Windows AD使用者OU汇出到新建的AD主机

目前因为关系企业需要单独独立一间公司出来,原本在总公司底下的AD OU群组必须要汇出单独分开,到另外...

【Day 04】C 的一些基本语法

识别符号 用来标示函式、变数,或者使用者自定专案的名称,识别符号可用大写字母(A 到 Z)、小写字母...

Day8 主动情蒐-情蒐流程、工具与漏洞简介

针对主动情蒐 主动情蒐指主动跟目标进行互动,会透过工具枚举所需的资讯,本系列文会介绍以下几种工具。 ...