Brother MFC-7820N already has a scanner driver you can download here but that are prebuilt binary (x86/x64) and source code isn't public. This is a problem if you want to use the scanner on ARM architecture or FreeBSD, because if you don't have the source code of the driver you can't recompile it. Anyway this should work on every scanner that use brscan2
, but I'm not sure.
When we open a connection with the scanner on port 54921, it respond with his status code:
+OK 200
: Ready to use-NG 401
: Scanner is busy
Now we can send a request that specify resolution and color mode, then scanner send to client a offer based on request. I called this part `lease because it recalled me DHCP lease
request := []byte(fmt.Sprintf("\x1bI\nR=%d,%d\nM=%s\n\x80", resolution, resolution, mode))
sendPacket(socket, request)
300,300,2,209,2480,294,3472
response[2]
: ADF status
response[0]
response[1]
: Image DPIresponse[3]
response[5]
: Plane dimensions in mmresponse[4]
response[6]
: Image resolution in px
- GRAY64: gray scale image ** NOT IMPLEMENTED **
- CGRAY: color image ** NOT IMPLEMENTED **
- TEXT: low resolution mode, 1 bps
- 100x100
- 150x150
- 200x200
- 300x300
- 600x600
- 1200x1200 untested
- 1200x2400 untested
Now we are ready to send start scan request:
width = mmToPixels(planeWidth, dpiX)
height = mmToPixels(planeHeight, dpiY)
requestFormat := "\x1bX\nR=%v,%v\nM=%s\nC=%s\nJ=MID\nB=50\nN=50\nA=0,0,%d,%d\n\x80"
request = []byte(fmt.Sprintf(requestFormat, dpiX, dpiY, mode, compression, width, height))
- R =
X_DPI
,Y_DPI
- M =
CGRAY
,GRAY64
,TEXT
- C =
JPEG
orRLENGTH
orNONE
JPEG/RLENGTH UNTESTED - D = SIN
- B = 50 (Brightness?)
- N = 50 (Contrast?)
- A = 0,0,
WIDTH
,HEIGHT
git clone https://github.com/corsmith/mfc-7820n.git
go build -o mfc-7820n mfc-7820n/src/*.go
./mfc-7820n --help
Output:
Usage of ./mfc-7820n:
-a string
IP address of the Brother scanner (default "192.168.0.157")
-c string
Color mode of the scan (CGRAY, GRAY64, TEXT) (default "TEXT")
-m Enable scan of all pages from feeder
-n string
Name of the output file (default "scan.tiff")
-r int
Resolution of the scan (default 300)
-i string
Name of the raw input file to parse instead of connecting to the printer
- Implement CGRAY decoding
- Implement GRAY64 decoding
Partially thanks to this